package cn.good.yan.service.t7;


import java.util.concurrent.atomic.DoubleAccumulator;
import java.util.concurrent.atomic.DoubleAdder;
import java.util.concurrent.atomic.LongAccumulator;
import java.util.concurrent.atomic.LongAdder;
import java.util.function.LongBinaryOperator;

/**
 * 7. 原子类
 * LongAccumulator 、LongAccumulator 原子类
 * LongAdder 比 AtomicInteger 效率高（减少死循环）
 * LongAdder ：创建一个初始总和为0的加法器
 * LongAccumulator ： 使用自自定义
 * DoubleAdder、DoubleAccumulator （与上面同理）
 *
 * @author shengren.yan
 * @create 2024-04-02
 */
public class AtomicDemo6 {
    public static void main(String[] args) {
        // LongAdder ，它是从0开始
        LongAdder longAdder = new LongAdder();
        longAdder.increment(); // 当前value值 + 1
        longAdder.increment();
        longAdder.increment();
        // 返回当前值，最新值是3
        System.out.println("increment() +1 操作得到值：" + longAdder.sum());
        longAdder.increment();
        longAdder.decrement(); // 当前值 - 1
        longAdder.add(5);  // 当前值 + 5
        System.out.println("decrement() -1 操作得到值：" + longAdder.sum()); // 值是 3+5 = 8
        longAdder.reset(); // 将值重置为0，此方法并发不高可以使用
        System.out.println("reset() 初始化：" + longAdder.sum()); // 值是 0
        longAdder.sumThenReset(); // 当前值，设置为0

        // LongAccumulator ，它初始值，可以不是0，参数2：初始值（案例是2），参数1：可以自定义规则，可以定义（+ - * /）
        LongAccumulator longAccumulator = new LongAccumulator(new LongBinaryOperator() {
            @Override  // left (初始值是 默认值2，定义为：当前值)，right 要操作的值，accumulate方法里的值
            public long applyAsLong(long left, long right) {
                return left * right;
            }
        }, 2);
        longAccumulator.accumulate(1); // 2*1 =2
        longAccumulator.accumulate(3);//  2*3 =6
        System.out.println("accumulate() 自定义计算：" + longAccumulator.get());

        // Double 类型的 （同理）
        DoubleAccumulator d1 = new DoubleAccumulator((x, y) -> {
            return x + y;
        }, 1.2);
        DoubleAdder adder = new DoubleAdder();
    }


}
